#include<event2/event.h>
#include<signal.h>
#include<iostream>
using namespace std;
static void CTRL_C_cb(int sock,short what, void *arg)
{
    cout<<"CTRL_C_cb"<<endl;
    event_base *eb=(event_base *)arg;
    //执行完当前事件就退出
    //event_base_loopbreak(eb);
    //执行所以事件也不退出，知道没有事件再运行一段时间再退出
    timeval t1={3,0};
    event_base_loopexit(eb,&t1);
   
}
static void Kill(int sock,short what, void *arg)
{
    cout<<"Kill"<<endl;
    event *ev=(event* )arg;
    //判断是否为非待决状态
    if(!event_pending(ev,EV_SIGNAL,0))
    {
        //重新添加
        event_del(ev);
        event_add(ev,NULL);
    }

   
}
int main(int argc,char **argv)
{
    // event_config *ec= event_config_new();
    // event_base *eb=event_base_new_with_config(ec);

    // event_base_free(eb);
    // event_config_free(ec);
    event_base *eb=event_base_new();
    //添加信号 Ctrl +c  no pending状态
    event *csig=evsignal_new(eb,SIGINT,CTRL_C_cb,eb);
    if(!csig)
    {
        cerr<<"evsignal_new failed"<<endl;
        return -1;
    }
    //kill信号  event_self_cbarg传递当前的event 
    event *ksig=event_new(eb,SIGTERM,EV_SIGNAL,Kill,event_self_cbarg());
    //添加事件 -》pending
    if(event_add(csig,0)!=0)
    {
        cerr<<"event_add failed"<<endl;
    }
    if(event_add(ksig,0)!=0)
    {
        cerr<<"ksig event_add failed"<<endl;
    }
    //进入事件主循环
    // event_base_dispatch(eb);
    //EVLOOP_ONCE 等待一个事件运行，直到没有活动事件就退出
    //event_base_loop(eb,EVLOOP_ONCE); 没有事件退出
    //有活动事件就处理，没活动就退出
    //event_base_loop(eb,EVLOOP_NONBLOCK); 没有事件退出
    //没有注册事件也不返回，用于事件后期多线程添加
    event_base_loop(eb,EVLOOP_NO_EXIT_ON_EMPTY);

    event_free(csig);
    event_base_free(eb);
    
    return 0;
}